/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sachovykon;

import java.util.Arrays;

/**
 *
 * @author Riso-Desktop
 */
public class Sachovnica {
    
    int polemoznosti[][];
    boolean navstivene[][];
    Konik kon;
    
    
    public Sachovnica(int n,int konR,int konS){
        polemoznosti = new int[n][n]; //obsahuje počet políčok, z ktorých sa dá dostať na dané pole
        navstivene = new boolean[n][n];//či už políčko bolo navštívené alebo nie
        kon = new Konik(konR, konS);
        nastavNavstivene(); //nastaví všetky hodnoty na false
        navstivene[konR][konS]=true;
        nastavMoznosti(); //prepočíta z koľkých políčok sa dá dostať na dané políčko(pre všetky políčka)
        
    }    
    public void vypis(){
        //vypíše hodnoty všetkých polí (debug)
        for (int i = 0; i < polemoznosti.length; i++) {
            for (int j = 0; j < polemoznosti.length; j++) {
                if(kon.getPozR()==i&&kon.getPozS()==j){
                    System.out.print("|"+polemoznosti[i][j]+"|");
                }else
                System.out.print(" "+polemoznosti[i][j]+" ");
            }
            System.out.println();
        }
        for (int i = 0; i < navstivene.length; i++) {
            for (int j = 0; j < navstivene.length; j++) {
                System.out.print(navstivene[i][j]+" ");
            }
            System.out.println();
        }
    }
    public int[] dalsiKrok(){
        //vypočíta ktorý krok je najvhodnejší
        int pozR = kon.getPozR();//aktuálne pozície koníka
        int pozS = kon.getPozS();
        int pohybR=-1;//pomocné premenné pre výpočet pohybu
        int pohybS=-1;
        boolean prvy = true;
        for (int i = 0; i < 8; i++) {
            int r = pozR;
            int s = pozS;
            switch(i){
                //všetky možnosti pohybu
                //r-riadok  s-stĺpec
                case 0:  r -= 2; s += 1; break;
                case 1:  r -= 1; s += 2; break;
                case 2:  r += 1; s += 2; break;
                case 3:  r += 2; s += 1; break;
                case 4:  r += 2; s -= 1; break;
                case 5:  r += 1; s -= 2; break;
                case 6:  r -= 1; s -= 2; break;
                case 7:  r -= 2; s -= 1; break;
            }
            if(r>=0&&r<=polemoznosti.length-1&&s>=0&&s<=polemoznosti.length-1&&navstivene[r][s]==false){
                //ak je políčko na šachovnici
                if(prvy){//inicializácia pre prvý pohyb
                    pohybR=r;
                    pohybS=s;
                    prvy=false;
                }
                if(polemoznosti[r][s]<=polemoznosti[pohybR][pohybS]&&polemoznosti[r][s]!=0){
                        //porovnávanie, ktorý pohyb je najvhodnejší
                        pohybR=r;
                        pohybS=s;
                }
            }
        }
        kon.setPozR(pohybR);//nastavenie koníka na vybrané políčko
        kon.setPozS(pohybS);
        if(pohybR<0){//ak nezostáva žiadny vhodný pohyb
            int pole[]={-1,-1};
            return pole;
        }
        navstivene[pohybR][pohybS]=true;
        nastavMoznosti();
        int pole[] = {kon.getPozR(),kon.getPozS()};
        return pole;
    }
    private void nastavNavstivene(){
        //nastaví všetky hodnoty na false
        for (int i = 0; i < polemoznosti.length; i++) {
            Arrays.fill(navstivene[i], false);
        }
    }
    private void nastavMoznosti(){
        //nastaví počet možností vstupu na každé pole
        for (int i = 0; i < polemoznosti.length; i++) {
            for (int j = 0; j < polemoznosti.length; j++) {
                    int pocet=0;
                for (int k = 0; k < 8; k++) {
                    int r= i;
                    int s = j;
                    switch(k){
                        case 0:  r -= 2; s += 1; break;
                        case 1:  r -= 1; s += 2; break;
                        case 2:  r += 1; s += 2; break;
                        case 3:  r += 2; s += 1; break;
                        case 4:  r += 2; s -= 1; break;
                        case 5:  r += 1; s -= 2; break;
                        case 6:  r -= 1; s -= 2; break;
                        case 7:  r -= 2; s -= 1; break;
                        }
                    if(r>=0&&r<=polemoznosti.length-1&&s>=0&&s<=polemoznosti.length-1&&navstivene[r][s]==false){
                        pocet++;
                    }
                }
                polemoznosti[i][j]=pocet;
            }
            
        }
    }
}
